package com.truedian.wg.components.organism.dialog.internal

import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import com.cc.openeye.base.BasePager
import com.tencent.kuikly.core.reactive.collection.ObservableList
import com.truedian.wg.components.organism.dialogUtil.internal.DialogComponent
import com.truedian.wg.components.organism.dialogUtil.internal.DialogId


/**
 * 弹窗堆栈管理器
 *
 * 负责管理单个页面内的弹窗堆栈，提供弹窗的添加、移除、查找等操作。
 * 支持多个弹窗同时存在，并维护弹窗的显示顺序和状态。
 *
 * ## 主要功能
 * - 维护弹窗堆栈的有序列表
 * - 提供弹窗的增删查操作
 * - 监控所有弹窗的取消状态
 * - 支持按ID查找特定弹窗
 *
 * ## 技术实现
 * - 使用[mutableStateListOf]实现响应式堆栈
 * - 通过[mutableStateOf]跟踪全局取消状态
 * - 支持栈顶操作和指定ID操作两种模式
 *
 * @see DialogStackItem 弹窗堆栈项
 * @see DialogHelper 弹窗助手类
 *
 * @since 1.0.0
 * @author CSP
 */
internal class DialogStackManager(val pager: BasePager, private val dialogStack: ObservableList<DialogStackItem>) {


    /**
     * 所有弹窗取消状态
     *
     * 当所有弹窗都处于取消状态时为true。
     */
    var isAllDialogInCancel  = false

    /**
     * 添加弹窗到堆栈
     *
     * 创建新的弹窗堆栈项并添加到堆栈顶部。
     *
     * @param dialogId 弹窗唯一标识
     * @param dialogPosition 弹窗显示位置
     * @param dialogUiConfig 弹窗UI配置
     * @param dialogComponent 弹窗内容组件
     */
    fun addDialog(
        dialogId: DialogId,
        dialogPosition: DialogPosition,
        dialogUiConfig: DialogConfig,
        dialogComponent: DialogComponent
    ) {
        val dialogStackItem = DialogStackItem(
            dialogId,
            dialogComponent,
            dialogPosition,
            dialogUiConfig = dialogUiConfig
        )
        dialogStack.add(dialogStackItem)
    }

    /**
     * 从堆栈移除弹窗
     *
     * 移除指定ID的弹窗或栈顶弹窗。
     *
     * @param dialogId 要移除的弹窗ID，为null时移除栈顶弹窗
     * @return 被移除的弹窗组件，如果未找到则返回null
     */
    fun removeDialog(dialogId: DialogId? = null): DialogComponent? {
        val isRemoveTop = dialogId == null
        if (isRemoveTop) {
            if (dialogStack.isNotEmpty()) {
                return dialogStack.removeAt(dialogStack.size - 1).dialogComponent
            }
            return null
        } else {
            val item = dialogStack.find { dialogStackItem ->
                dialogStackItem.dialogId == dialogId
            } ?: return null
            dialogStack.remove(item)
            return item.dialogComponent
        }
    }

    /**
     * 获取弹窗
     *
     * 查找指定ID的弹窗或获取栈顶弹窗。
     *
     * @param dialogId 要查找的弹窗ID，为null时返回栈顶弹窗
     * @return 找到的弹窗堆栈项，如果未找到则返回null
     */
    fun getDialog(dialogId: DialogId? = null): DialogStackItem? {
        if (dialogId == null) {
            if (dialogStack.isNotEmpty()) {
                return dialogStack[dialogStack.size - 1]
            }
            return null
        } else {
            val item = dialogStack.find { dialogStackItem ->
                dialogStackItem.dialogId == dialogId
            }
            return item
        }
    }

    /**
     * 获取弹窗堆栈
     *
     * @return 当前的弹窗堆栈列表
     */
    fun getDialogStackInternal() = dialogStack

    /**
     * 获取全局取消状态
     *
     * @return 表示所有弹窗取消状态的MutableState
     */
    fun getIsAllDialogInCancel() = isAllDialogInCancel
}